;function XHR() {

  //默认请求参数
  var _options = {
    url: null,
    type: 'GET',
    data: null,
    dataType: 'text',
    jsonp: 'callback',
    jsonpCallback: 'jsonpCallback',
    async: true,
    cache: true,
    timeout:null,
    contentType: 'application/x-www-form-urlencoded',
    success: null,
    error: null
  }

  //deferred模式
  var deferred = Deferred();

  // json转化为字符串
  var _param = function(data) {
    var str = '';
    if( !data || _empty(data)) {
      return str;
    }
    for(var key in data) {
      str += key + '='+ data[key]+'&'
    }
    str = str.slice(0,-1);
    return str;

  }
  //判断对象是否为空
  var _empty = function(obj) {
    for(var key in obj) {
      return false;
    }
    return true;
  }
  // jsonp处理函数
  function sendJsonpRequest(url,callbackName,succCallback) {

    var script = document.createElement('script');

    script.type="text/javascript";
    script.src=url;

    document.body.appendChild(script);
    // 如果用户自己定义了回调函数，就用自己定义的，负责，调用success函数
    window[callbackName] = window[callbackName] || succCallback;

  }

  /*外部调用接口*/
  var requestList = {
    ajax: function (options) {

      // 没有传参或者没有url，抛出错误
      if( !options || !options.url ) {
        throw('参数错误！');
      }
      //XMLHttpRequest传参无影响
      var xhr = new (window.XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP');

      // 继承操作
      options.type = options.type.toUpperCase();
      XHR._extend(options,_options);

      /*jsonp部分，直接返回*/
      if( options.dataType === 'jsonp' ) {
        var jsonpUrl = options.url.indexOf('?') > -1 ? options.url: options.url +
          '?' + options.jsonp+ '=' + options.jsonpCallback;

        sendJsonpRequest(jsonpUrl,options.jsonpCallback,options.success);
        
        return deferred;
      }

      // get搜索字符串
      var search = '';

      // 将data序列化
      var param= _param(options.data)

      if( options.type === 'GET' ) {
        search = (options.url.indexOf('?') > -1 ? '&' : '?') + param;
        if(!options.cache) {
          search += '&radom='+Math.random();
        }
        
        param = null;
      }

      xhr.open( options.type, options.url + search, options.async );

      xhr.onreadystatechange = function() {
        if( xhr.readyState == 4 ) {
          if( xhr.status >= 200 && xhr.status < 300 || xhr.status == 304 ) {
            var text = xhr.responseText;
            // json格式转换
            if(options.dataType == 'json') {
                text = XHR.parseJSON(text)
            }
            // 成功后把success加入deferred
            if( typeof options.success === 'function') {

              deferred.done( options.success );
            }

            deferred.resolve(null,text,xhr.status);
            
          }else {
            // 失败后把error加入dererred
            if(typeof options.error === 'function') {
              deferred.fail(options.error);
            }

            deferred.reject('加载错误',500);
            
          }
        }
      }

      xhr.setRequestHeader('content-type',options.contentType);
      // get请求时param时null
      xhr.send(param);

      // 如果设置了超时，就定义
      if(typeof options.timeout === 'number') {
        // ie9+
        if( xhr.timeout ) {
          xhr.timeout = options.timeout;
        }else {
          setTimeout(function() {
            xhr.abort();
          },options.timeout)
        }
      }
      // 直接返回deferred
      return deferred;

    },
    get: function(url,data,callback,type) {
      if(typeof data === 'function') {
        type = callback;
        callback = data;
        data = null;
      }
      if(typeof data === 'string') {
        type = data;
        data = null;
      }

      return requestList.ajax({
        url: url,
        data: data,
        type: 'GET',
        dataType: type || 'text',
        success: callback
      })
    },
    post: function(url,data,callback) {
      return requestList.ajax({
        url: url,
        data: data,
        type: 'post',
        success: callback
      })
    }
  }

  return requestList;


}

// 简单对象继承
// 第二个参数是默认对象，第一个参数是用户自定义对象。
// 第一个对象没有的属性，将会使用第二个对象的值。
XHR._extend = function(target,options) {
  if( typeof target !== 'object' || typeof options !== 'object' ) {
    return;
  }
  var copy ,clone, name;
  for( name in options ) {
    if(options.hasOwnProperty(name) && !target.hasOwnProperty(name)) {
      target[name] = options[name];
    }
  }
  return target;
};

// 自定义text转化json格式
XHR.parseJSON = function(text) {
  if(typeof text !== 'string') {
    return;
  }
  if( JSON && JSON.parse ) {
    return JSON.parse(text);
  }
  return (new Function('return '+text))();
}